/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package firma;

import java.security.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author kastillo
 */
public class firmas {

    public static void main(String args[]) throws NoSuchAlgorithmException, InvalidKeyException, FileNotFoundException, IOException, SignatureException {

        String algorithm = "RSA";
        if (args.length == 1) {
            algorithm = args[0];
        }
 
            // Generar las llaves
            KeyPairGenerator generator = KeyPairGenerator.getInstance(algorithm);
            generator.initialize(1024);
            KeyPair keypair = generator.generateKeyPair();
            PrivateKey priv = keypair.getPrivate();
            PublicKey pub = keypair.getPublic();
            System.out.println(pub);
            System.out.println(priv);

            // Crear e iniciar un objeto para realizar firmas
            Signature rsa = Signature.getInstance(priv.getAlgorithm());
            rsa.initSign(priv);

            // Leer el archivo y guardarlo en el objeto para
            // firmar

            FileInputStream fis = new FileInputStream(args[1]);
            BufferedInputStream bufin = new BufferedInputStream(fis);

            byte[] buffer = new byte[1024];
            int len;

            while (bufin.available() != 0) {
                len = bufin.read(buffer);
                rsa.update(buffer, 0, len);
            }
            bufin.close();

            // Firmar y escribir firma

            byte[] firma = rsa.sign();
            String s1 = new String(firma);
            System.out.println("Firma:" + s1);

            // Crear e iniciar un objeto para verificar firmas

            Signature sig = Signature.getInstance(pub.getAlgorithm());
            sig.initVerify(pub);

            // Leer el archivo y guardarlo en objeto para
            // verificarfirmas

            FileInputStream datafis = new FileInputStream(args[1]);
            bufin = new BufferedInputStream(datafis);
            while (bufin.available() != 0) {
                len = bufin.read(buffer);
                sig.update(buffer, 0, len);
            }
            bufin.close();

            // Verificar la firma

            boolean verifies = sig.verify(firma);
            System.out.println("Verificacion de la firma: " + verifies);


    }
}
